/**
* mpsvr主控类
* @author thinkry
*/

#ifndef __MPSVR_CTRL_H__
#define __MPSVR_CTRL_H__

#include "mpdef.h"
#include "ipc/CTShm.h"
#include "CTCodeQueue.h"
#include "net/CTSocket.h"
#include "net/CTEpoll.h"
#include "CTStat.h"
#include <vector>

enum enumProcessStatus
{
    EPS_IDLE = 0,   ///< 空闲状态
    EPS_RUNING,     ///< 
};

class CProcessData
{
public:
    CProcessData(): m_iChildPid(0), m_iChildStatus(0) {}
    pid_t           m_iChildPid;
    int             m_iChildStatus;
};

/**
* mpsvr主控类
*/
class CMpCtrl
{
protected:
    pid_t                   m_iNetPid;
    vector<CProcessData>    m_vecWorker;         ///< 保存子进程信息的数组

    static bool s_bReloadConfig;
    static bool s_bExit;

public:
    CMpCtrl();
    virtual ~CMpCtrl();

    /** 初始化 */
    void Init();

    /** 主循环 */
    void Run();

    /** 退出 */
    void Exit();

    static void sigusr1_handle(int iSigVal);
    static void sigusr2_handle(int iSigVal);

protected:
    void ReloadConfig();

    /** 创建网络子进程 */
    void ForkNetProcess();

    /** 检查网络子进程是否都存在 */
    void CheckNetProcess();

    /** 创建工作子进程 */
    void ForkWorkerProcess();

    /** 检查工作子进程是否都存在 */
    int CheckWorkerProcess();

    /**
    * 创建一个工作子进程
    * @param[in] iIndex 子进程对应在m_vecWorker中的下标
    */
    void ForkOneWorker(int iIndex);

    /**
    * 向所有的子进程发送信号
    * @param[in] iSigVal 信号值
    */
    void SignalProcess(int iSigVal);
};

#endif //__MPSVR_CTRL_H__
